﻿#region Header

/*
    This file is part of ndoctor-statistics.

    ndoctor-statistics is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    ndoctor-statistics is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with ndoctor-statistics.  If not, see <http://www.gnu.org/licenses/>.
*/

#endregion Header

namespace Probel.NDoctor.Statistics
{
    using System.Collections.Generic;

    using Probel.NDoctor.Statistics.Domain;

    public interface IRepository
    {
        #region Properties

        IEnumerable<Application> Applications
        {
            get;
        }

        IEnumerable<SessionDuration> Durations
        {
            get;
        }

        IEnumerable<StatisticEntry> Statistics
        {
            get;
        }

        #endregion Properties

        #region Methods

        /// <summary>
        /// Clears the database. It'll wipe all the data.
        /// </summary>
        void Clear();

        /// <summary>
        /// Imports the specified applications into the remote database.
        /// </summary>
        /// <param name="applications">The applications.</param>
        /// <param name="statistics">The statistics.</param>
        /// <param name="durations">The durations.</param>
        void Import(IEnumerable<Application> applications, IEnumerable<StatisticEntry> statistics, IEnumerable<SessionDuration> durations);

        /// <summary>
        /// Exports the specified statistics into the remote repository.
        /// </summary>
        /// <param name="statistics">The statistics.</param>
        void Insert(IEnumerable<StatisticEntry> statistics);

        /// <summary>
        /// Exports the specified durations into the remote repository.
        /// </summary>
        /// <param name="durations">The durations.</param>
        void Insert(IEnumerable<SessionDuration> durations);

        /// <summary>
        /// Exports the specified durations into the remote repository.
        /// </summary>
        /// <param name="durations">The durations.</param>
        void Insert(SessionDuration duration);

        /// <summary>
        /// Inserts the specified statistic into the remote repository.
        /// </summary>
        /// <param name="statistic">The statistic.</param>
        void Insert(StatisticEntry statistic);

        /// <summary>
        /// Insert a new user into the database
        /// </summary>
        /// <param name="user">The user.</param>
        void Insert(Application user);

        /// <summary>
        /// Updates the specified application.
        /// </summary>
        /// <param name="application">The application.</param>
        void Update(Application application);

        #endregion Methods
    }
}